home *** CD-ROM | disk | FTP | other *** search
AMOS Source Code | 2001-04-15 | 9.5 KB | 344 lines |
- Set Buffer 100
- MXDIR=400 : MXSCAN=250
- Dim DB$(MXDIR),DBA(MXDIR)
- Screen Open 0,640,256,2,$8000
- Curs Off : Flash Off : Paper 0 : Pen 1 : Cls
- Dev Open 0,"3rd.scsi.device",128,2,0
- Reserve As Work 8,8*1024*1024
- I=256
- ' 6335280
- For A=2048*2048 To 6335279 Step 8*1024*2
- Home : Print A/2048
- For AA=0 To 8*1024*2-1 Step 64*2
- DISKREAD[Start(8)+AA*512,-64*1024,A+AA]
- Next
- Extension_8_0472 "mp3:Image"+ Extension_8_0EB8(I,3),8
- Inc I
- Next
- End
- CACBLK=10
- Reserve As Work 11,2000*12
- ACH=Start(11)
- Reserve As Work 8,512*CACBLK
- DISKREAD[Start(8),-Length(8),0]
- Reserve As Chip Work 9,1024
- ST=Start(9)
- Reserve As Chip Work 10,1024
- ST2=Start(10)
- DISKREAD[ST,512,0]
- If Leek(ST)<> Extension_8_0998("RDSK") Then Print "No RDB-Block!" : Stop
- PARTBLK=Leek(ST+28)
- DBA(0)=-1
- DB$(0)="Dh1.1:Recover"
- Do
- Exit If PARTBLK<1
- DISKREAD[ST,512,PARTBLK]
- If Leek(ST)<> Extension_8_0998("PART") Then Print "Invalid partition" : Stop
- HEADS=Leek(ST+12+128) : BLKPERTRK=Leek(ST+20+128)
- BLKPERCYL=HEADS*BLKPERTRK
- BASE=Leek(ST+36+128)*BLKPERCYL
- NUMBLK=Leek(ST+40+128)*BLKPERCYL-STBLK
- Print "PART BLOCK: ";PARTBLK
- Print " Device : ";Peek$(ST+37,Peek(ST+36));":"
- Print " Heads per Cyl.:";HEADS
- Print " Blks per Track:";BLKPERTRK
- Print " First block :";BASE
- Print " Num blocks :";NUMBLK
- PARTBLK=Leek(ST+16)
- DISKREAD[ST,512,BASE]
- If Leek(ST)= Extension_8_0998("PFS1")-48
- Print "Scanning for valid IB-Blocks..."
- For BLK=0 To MXSCAN
- DISKREAD[ST,1024,BASE+BLK*2]
- If Deek(ST)= Extension_8_098C("IB")
- Print " Index Block";BLK;": ";
- For A=0 To 252
- ARGL=Leek(ST+12+A*4)
- If ARGL>0 and ARGL<NUMBLK
- DISKREAD[ST2,1024,BASE+ARGL]
- If Deek(ST2)= Extension_8_098C("AB")
- If Leek(ST2+8)<>A
- Exit
- End If
- Else
- Exit
- End If
- End If
- Next
- If A=253
- Print "Block valid!"
- Else
- Print "Block invalid!"
- End If
- End If
- Next
- Input "Choose index block for anode chain: ";AI
- Print "Creating anode list...";
- DISKREAD[ST,1024,BASE+AI*2]
- ANOD=0
- For A=0 To 252
- ARGL=Leek(ST+12+A*4)
- If ARGL>0
- DISKREAD[ST2,1024,BASE+ARGL]
- Copy ST2+16,ST2+16+12*84 To ACH+ANOD*12 : Add ANOD,84
- End If
- Next
- Print "Number of anodes:";ANOD
- ROOT=Leek(ACH+5*12+4)/2
- Print "Rootblock dir:";ROOT
- NUMD=1
- DBA(0)=ROOT
- DBA(NUMD)=-1
- Print "Scanning directories..."
- DIB=0
- Do
- Exit If DBA(DIB)=-1
- BLK=DBA(DIB)
- DISKREAD[ST,1024,BASE+BLK*2]
- If Deek(ST)= Extension_8_098C("DB")
- ALL=0
- Print " Dir block";BLK;" of ";DB$(DIB)
- PAR=Leek(ST+16) : ANO=Leek(ST+12)
- FP=20
- Do
- SIZ=Peek(ST+FP) : Exit If SIZ=0
- TYP=Peek(ST+FP+1)
- ANODE=Leek(ST+FP+2)
- FSIZE=Leek(ST+FP+6)
- DATE=Deek(ST+FP+10)
- TIME= Extension_8_0946(Deek(ST+FP+12))+Deek(ST+FP+14)
- PROT=Peek(ST+FP+16)
- NAME$=Peek$(ST+FP+18,Peek(ST+FP+17))
- COMM$=Peek$(ST+FP+19+Len(NAME$),Peek(ST+FP+18+Len(NAME$)))
- ' Print NAME$;Space$(34-Len(NAME$));
- If TYP=253
- ' Print Lsstr$(FSIZE,8);" ";
- Else
- NDN$= Extension_8_03EC(DB$(DIB))+NAME$
- ' Print NDN$;Space$(34-Len(NAME$));ANODE
- NANO=ANODE
- Trap Mkdir NDN$
- While NANO<>0
- DB$(NUMD)=NDN$
- DBA(NUMD)=Leek(ACH+NANO*12+4)/2
- NANO=Leek(ACH+NANO*12+8)
- Inc NUMD
- DBA(NUMD)=-1
- Wend
- ' Print " <DIR> ";
- End If
- ' Print Object Protection$(PROT);" ";Cd Date$(DATE);Ct Time$(TIME)
- ' Print COMM$;" ";
- If TYP=253 and(Instr(NAME$,"Crack")<>0 or Instr(NAME$,"Daten")<>0)
- FILN$= Extension_8_03EC(DB$(DIB))+NAME$
- If Exist(FILN$)=0
- If ALL=0
- If FSIZE>2*1024*1024
- Print "Save (S/N/A)? ";
- Repeat
- I$=Inkey$ : Multi Wait
- Until I$="n" or I$="s" or I$="a"
- If I$="a"
- I$="s" : ALL=1
- End If
- Else
- I$="s"
- End If
- Else
- I$="s"
- End If
- If I$="s"
- If Exist(DB$(DIB))=0
- Mkdir DB$(DIB)
- End If
- FSIZ=FSIZE : STANODE=ANODE
- Open Out 1,FILN$
- While FSIZ
- If STANODE<1
- Stop
- End If
- CSIZ=Leek(ACH+STANODE*12)*512
- RSIZ=Min(CSIZ,100*1024) : OSET=BASE+Leek(ACH+STANODE*12+4)
- While RSIZ
- Print ".";
- Reserve As Chip Work 19,RSIZ
- DISKREAD[Start(19),RSIZ,OSET]
- Extension_8_17B6 1,Start(19) To Min(RSIZ,FSIZ)
- Add OSET,RSIZ/512
- Add CSIZ,-RSIZ
- Add FSIZ,-Min(RSIZ,FSIZ)
- RSIZ=Min(CSIZ,100*1024)
- Wend
- STANODE=Leek(ACH+STANODE*12+8)
- Wend
- Close 1
- Extension_8_16F8 FILN$,DATE,TIME
- Extension_8_0780 FILN$,PROT
- End If
- End If
- End If
- ' Print
- Add FP,SIZ
- Loop
- Else
- Print "Fuckin error!"; Extension_8_08C4(Deek(ST))
- Wait Key
- End If
- Inc DIB
- Loop
- End If
- Print
- Loop
- Dev Close
- End
- DUMMY:
- Print "Scanning for valid Disk Blocks..."
- For BLK=0 To MXSCAN
- DISKREAD[ST,1024,BASE+BLK*2]
- If Deek(ST)= Extension_8_098C("DB")
- FAIL=0
- PAR=Leek(ST+16) : ANO=Leek(ST+12)
- ' FP=20
- ' Do
- ' SIZ=Peek(ST+FP) : Exit If SIZ=0
- ' TYP=Peek(ST+FP+1)
- ' ANODE=Leek(ST+FP+2)
- ' Add FP,SIZ
- ' DISKREAD[ST2,512,BASE+(ANODE/84)*2]
- ' If Deek(ST2)<>Asc.w("IB")
- ' FAIL=1 : Exit
- ' End If
- ' Loop
- If FAIL=0
- Print " Dir block";BLK,
- DBA(NUMD)=BLK : Inc NUMD
- End If
- End If
- Next
- Print "Searching for Root Block..."
- NUMB=NUMD
- NUMD=0
- For DIB=0 To NUMB-1
- BLK=DBA(DIB)
- DISKREAD[ST,1024,BASE+BLK*2]
- If Leek(ST+16)=0
- DB$(NUMD)="ROOT:"
- DBA(NUMD)=BLK : Inc NUMD
- End If
- Next
- Print "Rootblock dirs:";NUMD
- DBA(NUMD)=-1
- Print "Scanning directories..."
- DIB=0
- Do
- Exit If DBA(DIB)=-1
- BLK=DBA(DIB)
- DISKREAD[ST,1024,BASE+BLK*2]
- Print " Dir block";BLK;" of ";DB$(DIB)
- PAR=Leek(ST+16) : ANO=Leek(ST+12)
- FP=20
- Do
- SIZ=Peek(ST+FP) : Exit If SIZ=0
- TYP=Peek(ST+FP+1)
- ANODE=Leek(ST+FP+2)
- FSIZE=Leek(ST+FP+6)
- DATE=Deek(ST+FP+10)
- TIME= Extension_8_0946(Deek(ST+FP+12))+Deek(ST+FP+14)
- PROT=Peek(ST+FP+16)
- NAME$=Peek$(ST+FP+18,Peek(ST+FP+17))
- ' Print NAME$;Space$(34-Len(NAME$));ANODE
- If TYP=253
- ' Print Lsstr$(FSIZE,7);" ";
- Else
- NDN$= Extension_8_03EC(DB$(DIB))+NAME$
- Print NDN$;Space$(34-Len(NAME$));ANODE
- For ARGL=0 To MXSCAN
- DISKREAD[ST2,1024,BASE+ARGL*2]
- If Deek(ST2)= Extension_8_098C("DB")
- If ANODE=Leek(ST2+16)
- Print ANODE,ARGL : Wait Key
- For AXL=0 To NUMD-1
- Exit If DBA(AXL)=ARGL
- Next
- If AXL=NUMD
- DB$(NUMD)=NDN$
- DBA(NUMD)=ARGL
- Inc NUMD
- DBA(NUMD)=-1
- End If
- End If
- End If
- Next
- ' Print " <DIR> ";
- End If
- ' Print Object Protection$(PROT);" ";Cd Date$(DATE);Ct Time$(TIME)
- Add FP,SIZ
- If TYP=253
- Print "Start of cluster:";Leek(ACH+ANODE*12+4)
- Print "Size of cluster :";Leek(ACH+ANODE*12)
- Print "Next anode :";Leek(ACH+ANODE*12+8)
- Wait Key
- ' DISKREAD[ST2,1024,BASE+]
- End If
- ' Print " "
- Loop
- Inc DIB
- Loop
-
- Print "Scanning for valid MI-Blocks..."
- For BLK=0 To MXSCAN
- DISKREAD[ST,1024,BASE+BLK*2]
- If Deek(ST)= Extension_8_098C("MI")
- Print " Index Block";BLK;": ";
- For A=0 To 252
- ARGL=Leek(ST+12+A*4)
- If ARGL>0
- DISKREAD[ST2,1024,BASE+ARGL]
- If Deek(ST2)= Extension_8_098C("BM")
- If Leek(ST2+8)<>A
- Exit
- End If
- Else
- Exit
- End If
- End If
- Next
- If A=253
- Print "Block valid!"
- Else
- Print "Block invalid!"
- End If
- End If
- Next
- Wait Key
-
-
- Procedure DISKREAD[AD,LE,OS]
- If LE<0
- IO=Dev Base(0)
- Loke IO+36,-LE : Loke IO+40,AD
- If OS<2048*2048
- Loke IO+44,OS*512
- Else
- Doke IO+44,OS/128
- Doke IO+46,(OS mod 128)*512
- End If
- Dev Do 0,2
- Else
- If OS*512+LE<=Length(8)
- Copy Start(8)+OS*512,Start(8)+OS*512+LE To AD
- Else
- IO=Dev Base(0)
- Loke IO+36,LE : Loke IO+40,AD : Loke IO+44,OS*512
- Dev Do 0,2
- End If
- End If
- End Proc
- Procedure DISKWRITE[AD,LE,OS]
- IO=Dev Base(0)
- Loke IO+36,LE : Loke IO+40,AD : Loke IO+44,OS*512
- Dev Do 0,3
- End Proc
- Procedure DISKFLUSH
- Dev Do 0,4
- End Proc